package com.hireceivecard.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
/*******************************
 * @Author: lili
 * @Email: 974196651@qq.com
 * @CreateTime: 2024/3/24 12:14
 * @Describe: Token拦截器
 *******************************/
@Slf4j
@Component
public class TokenInterceptor implements HandlerInterceptor {
    /**
     * 目标方法执行前
     * 该方法在控制器处理请求方法前执行，其返回值表示是否中断后续操作
     * 返回 true 表示继续向下执行，返回 false 表示中断后续操作
     * @return
     */
    // Token方式所用。
//    @Resource
//    private TestClientService testClientService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("访问界面：" + request.getRequestURL());
        // 从 http 请求头中取出 token
        String token = request.getHeader("token");
        // 如果不是映射到方法直接通过
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();
        // JWT方式：
        // 获取 token 中的 user id
        // 执行认证
        if (token == null) {
            throw new RuntimeException("无token，请登录获取Token");
        }

        //验证token是否正确
        boolean result = JwtUtil.verify(token);
        if (result) {
            // TODO： 如果token正确，此时可以将用户信息封装到 treadLocal 中
            return true;
        } else {
            throw new RuntimeException("token过期或不正确，请重新登录");
        }
    }
    /**
     * 目标方法执行后
     * 该方法在控制器处理请求方法调用之后、解析视图之前执行
     * 可以通过此方法对请求域中的模型和视图做进一步修改
     */
    @Override
    public void postHandle (HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }
    /**
     * 页面渲染后
     * 该方法在视图渲染结束后执行
     * 可以通过此方法实现资源清理、记录日志信息等工作
     */
    @Override
    public void afterCompletion (HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }

}
